package testProxy.javassistcode;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtNewConstructor;
import javassist.CtNewMethod;
import testProxy.DBQuery;
import testProxy.IDBQuery;

public class JavassistCode {
	/**
	 * 使用Javassist动态代码实现的代理
	 * 
	 * @return
	 */
	public static IDBQuery createJavassistBytecodeProxy() throws Throwable {
		ClassPool pool = ClassPool.getDefault();
		// 创建一个类
		CtClass ctclass = pool.makeClass(IDBQuery.class.getName() + "_javassistbytecode_proxy");
		// 添加要实现的接口
		ctclass.addInterface(pool.get(IDBQuery.class.getName()));

		ctclass.addConstructor(CtNewConstructor.defaultConstructor(ctclass));
		// 添加域
		ctclass.addField(CtField.make("public " + IDBQuery.class.getName() + " real;", ctclass));
		// 添加方法
		ctclass.addMethod(CtNewMethod.make("public void request(){ if (real==null){ real=new " + DBQuery.class.getName()
				+ "();} return real.request();}", ctclass));

		Class pc = ctclass.toClass();
		return (IDBQuery) pc.newInstance();
	}
}
